package cn.com.header.zbpk.account.service;

import cn.com.header.core.IPage;
import cn.com.header.core.ISort;
import cn.com.header.zbpk.account.entity.User;
import cn.com.header.zbpk.account.model.UserExtend;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;

import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.regex.Pattern;

/**
 * 用户Service接口
 *
 * @author luohaidian
 * @date 2017-11-14
 * @time 09:59
 */
public interface IUserService extends UserDetailsService {

    /**
     * 匹配用户名字
     */
    Pattern NAME_PATTERN = Pattern.compile("([\\u4E00-\\u9FA5]{2,5})|([a-zA-z]{2,20})");

    /**
     * 匹配学号
     */
    Pattern JOBNUMBER_PATTERN = Pattern.compile("^[0-9a-zA-Z]{2,10}$");

    /**
     * 匹配学段名
     */
    Pattern SECTION_PATTERN = Pattern.compile("[\\u4E00-\\u9FA5]{1,5}");

    /**
     * 匹配年级名
     */
    Pattern GRADE_PATTERN = Pattern.compile("[\\u4E00-\\u9FA5]{1,5}");

    /**
     * 匹配手机号码
     */
    Pattern MOBILE_PATTERN = Pattern.compile("^((13\\d{9}$)|(15[0-9]\\d{8}$)|(18\\d{9}$)|(14[5,7,9]\\d{8})$)|(17[0,1,3,5,6,7,8]\\d{8})$");

    /**
     * 邮箱匹配格式
     */
    Pattern EMAIL_PATTERN = Pattern.compile("^\\w[-\\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\\.)+[A-Za-z]{2,14}$");

    /**
     * 匹配密码
     */
    Pattern PASSWORD_PATTERN = Pattern.compile("^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,8}$");

    /**
     * 匹配角色名，不能含有特殊字符
     */
    Pattern CHARACTER_PATTERN = Pattern.compile("[`~!@#$%^&*()+=|{}':',\\[\\].<>/?~！@#￥%……&*（）——+|{}【】‘；：”“’。，、？]");

    /**
     * 学生账号导入列数
     */
    static final int STUDENT_COL = 9;

    /**
     * 非学生账号导入列数
     */
    static final int OTHER_COL = 8;

    /**
     * 邮箱最大长度
     */
    final int EMAIL_LENGTH = 32;

    /**
     * 删除标记
     */
    interface DEL_MARK{
        Integer NO = 0;
        Integer YES = 1;
    }

    /**
     * 根据id查询用户信息
     * @param id
     * @param fields
     * @return
     */
    Optional<User> loadByPK(Long id, Set<String> fields);



    /**
     * 把用户ID保存到SecurityContextHolder中
     */
    interface SecurityUser extends UserDetails{

        Long getId();

        String getName();

        Long getSchoolId();

    }

    /**
     * 查询用户记录数
     * @param user 用户模型
     * @return
     */
    int loadCount(User user, String keyword);

    /**
     * 用户列表查询(按角色)
     * @param user 用户模型
     * @param keyword 搜索关键字
     * @param roleId 角色ID
     * @param sortSet 排序器
     * @param page 分页
     * @return
     */
    Map<String, Object> loadWithRole(User user, String keyword, Long roleId, Set<ISort> sortSet, IPage page);
    /**
     * 查询用户信息列表
     * @param user 用户模型
     * @param sortSet 排序器
     * @param page 分页
     * @param keyword 搜索关键字
     * @return
     */
    List<UserExtend> loads(User user, Set<ISort> sortSet, IPage page, String keyword);
}
